home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Language/OS - Multiplatform Resource Library
/
LANGUAGE OS.iso
/
cocktail
/
puma.lha
/
puma
/
src
/
puma.scan
< prev
next >
Wrap
Text File
|
1992-09-25
|
8KB
|
323 lines
/* Ich, Doktor Josef Grosch, Informatiker, 20.3.1989 */
EXPORT {
FROM StringMem IMPORT tStringRef;
FROM Idents IMPORT tIdent ;
FROM Texts IMPORT tText ;
FROM Positions IMPORT tPosition;
INSERT tScanAttribute
PROCEDURE Error (Text: ARRAY OF CHAR; Position: tPosition);
PROCEDURE ErrorI (Text: ARRAY OF CHAR; Position: tPosition; Ident: tIdent);
PROCEDURE Warning (Text: ARRAY OF CHAR; Position: tPosition);
PROCEDURE WarningI (Text: ARRAY OF CHAR; Position: tPosition; Ident: tIdent);
}
GLOBAL {
FROM SYSTEM IMPORT ADR;
FROM StringMem IMPORT PutString;
FROM Strings IMPORT tString, Concatenate, Char, SubString,
AssignEmpty, Length, WriteL;
FROM Idents IMPORT tIdent, MakeIdent, NoIdent, GetStringRef;
FROM Texts IMPORT MakeText, Append;
FROM Sets IMPORT IsElement;
FROM Tree IMPORT Options, ErrorCount;
FROM Positions IMPORT tPosition;
IMPORT Errors;
VAR NestingLevel: INTEGER; Position, StringPos: tPosition;
INSERT ErrorAttribute
PROCEDURE Error (Text: ARRAY OF CHAR; Position: tPosition);
BEGIN
Errors.Message (Text, Errors.Error, Position);
INC (ErrorCount);
END Error;
PROCEDURE ErrorI (Text: ARRAY OF CHAR; Position: tPosition; Ident: tIdent);
BEGIN
Errors.MessageI (Text, Errors.Error, Position, Errors.Ident, ADR (Ident));
INC (ErrorCount);
END ErrorI;
PROCEDURE Warning (Text: ARRAY OF CHAR; Position: tPosition);
BEGIN
IF NOT IsElement (ORD ('s'), Options) THEN
Errors.Message (Text, Errors.Warning, Position);
END;
END Warning;
PROCEDURE WarningI (Text: ARRAY OF CHAR; Position: tPosition; Ident: tIdent);
BEGIN
IF NOT IsElement (ORD ('s'), Options) THEN
Errors.MessageI (Text, Errors.Warning, Position, Errors.Ident, ADR (Ident));
END;
END WarningI;
}
LOCAL { VAR Word, String, TargetCode: tString; }
BEGIN { NestingLevel := 0; }
DEFAULT {
GetWord (Word);
Errors.MessageI ("illegal character", Errors.Error, Attribute.Position, Errors.String, ADR (Word));
}
EOF {
CASE yyStartState OF
| comment : Error ("unclosed comment", Position);
| expr ,
targetcode : Error ("unclosed target code", Position);
| CStr1, CStr2,
Str1, Str2 : Error ("unclosed string", StringPos);
ELSE
END;
}
DEFINE letter = {A-Z a-z _} .
digit = {0-9} .
CmtCh = - {*\t\n} .
StrCh1 = - {'\t\n} .
StrCh2 = - {"\t\n} .
CStrCh1 = - {'\t\n\\} .
CStrCh2 = - {"\t\n\\} .
code = - {\\\t\n{\}'"} .
anyExpr = - {\\\t\n{\}'":\ a-zA-Z} .
START comment, Str1, Str2, CStr1, CStr2, targetcode, expr
RULE
#targetcode# "{" : {
IF NestingLevel = 0 THEN
MakeText (Attribute.TargetBlock.Text);
AssignEmpty (TargetCode);
Position := Attribute.Position;
ELSE
GetWord (Word);
Concatenate (TargetCode, Word);
END;
INC (NestingLevel);
}
#targetcode# "}" :- {
DEC (NestingLevel);
IF NestingLevel = 0 THEN
yyStart (STD);
Append (Attribute.TargetBlock.Text, TargetCode);
Attribute.Position := Position;
RETURN TargetBlock;
ELSE
GetWord (Word);
Concatenate (TargetCode, Word);
END;
}
#targetcode# code + :- {
IF NestingLevel > 0 THEN
GetWord (Word);
Concatenate (TargetCode, Word);
END;
}
#targetcode# \t :- {
IF NestingLevel > 0 THEN
Strings.Append (TargetCode, 11C);
END;
yyTab;
}
#targetcode# \n :- {
IF NestingLevel > 0 THEN
Append (Attribute.TargetBlock.Text, TargetCode);
AssignEmpty (TargetCode);
END;
yyEol (0);
}
#targetcode# \\ ANY :- {
IF NestingLevel > 0 THEN
GetWord (Word);
Strings.Append (TargetCode, Char (Word, 2));
END;
}
#targetcode# \\ :- {
IF NestingLevel > 0 THEN
Strings.Append (TargetCode, '\');
END;
}
#STD, expr# "/*" : {yyStart (comment); Position := Attribute.Position;}
#comment# "*/" :- {yyPrevious;}
#comment# "*" | CmtCh + :- {}
#STD# \f | \r :- {}
#STD# (digit + "." digit * | digit * "." digit +) ({Ee} {+\-} ? digit +) ? | digit +
: {GetWord (Word);
Attribute.Number.StringRef := PutString (Word);
RETURN Number;}
#STD, expr, targetcode# ' :{GetWord (String);
StringPos := Attribute.Position;
IF IsElement (ORD ('c'), Options)
THEN yyStart (CStr1);
ELSE yyStart (Str1);
END;}
#STD, expr, targetcode# \":{GetWord (String);
StringPos := Attribute.Position;
IF IsElement (ORD ('c'), Options)
THEN yyStart (CStr2);
ELSE yyStart (Str2);
END;}
#Str1# StrCh1 + ,
#Str2# StrCh2 + ,
#CStr1# CStrCh1 + | \\ ANY ? ,
#CStr2# CStrCh2 + | \\ ANY ? :- {GetWord (Word); Concatenate (String, Word);}
#CStr1# \\ \n ,
#CStr2# \\ \n :- {GetWord (Word); Concatenate (String, Word); yyEol (0);}
#Str1, CStr1# ' ,
#Str2, CStr2# \" :- {Strings.Append (String, Char (String, 1));
yyPrevious;
IF yyStartState = targetcode THEN
Concatenate (TargetCode, String);
ELSE
Attribute.String.StringRef := PutString (String);
RETURN String;
END;}
#Str1, Str2, CStr1, CStr2# \t :- {Strings.Append (String, 11C); yyTab;}
#Str1, Str2, CStr1, CStr2# \n :- {Error ("unclosed string", Attribute.Position);
Strings.Append (String, Char (String, 1));
yyEol (0); yyPrevious;
IF yyStartState = targetcode THEN
Concatenate (TargetCode, String);
ELSE
Attribute.String.StringRef := PutString (String);
RETURN String;
END;}
#STD# "::" : {RETURN '::' ;}
#STD# "{" : {IF NestingLevel = 0 THEN Position := Attribute.Position; END;
yyStart (expr); INC (NestingLevel); RETURN '{';}
#expr# anyExpr * : {GetWord (Word);
Attribute.TargetCode.StringRef := PutString (Word);
RETURN TargetCode ;}
#expr# "{" : {INC (NestingLevel);
GetWord (Word);
Attribute.TargetCode.StringRef := PutString (Word);
RETURN TargetCode ;}
#expr# "}" : {DEC (NestingLevel);
IF NestingLevel = 0 THEN
yyStart (STD);
RETURN '}';
ELSE
GetWord (Word);
Attribute.TargetCode.StringRef := PutString (Word);
RETURN TargetCode;
END ;}
#expr# ":" : {GetWord (Word);
Attribute.TargetCode.StringRef := PutString (Word);
RETURN TargetCode ;}
#expr# "::" : {GetWord (Word);
Attribute.'::'.StringRef := PutString (Word);
RETURN '::' ;}
#expr# " " + : {GetWord (Word);
Attribute.WhiteSpace.StringRef := PutString (Word);
RETURN WhiteSpace ;}
#expr# \n : {GetWord (Word);
Attribute.WhiteSpace.StringRef := PutString (Word);
yyEol (0);
RETURN WhiteSpace ;}
#expr# \t : {GetWord (Word);
Attribute.WhiteSpace.StringRef := PutString (Word);
yyTab;
RETURN WhiteSpace ;}
#expr# \\ ANY : {GetWord (Word);
SubString (Word, 2, 2, String);
Attribute.TargetCode.StringRef := PutString (String);
RETURN TargetCode ;}
#expr# \\ : {GetWord (Word);
Attribute.TargetCode.StringRef := PutString (Word);
RETURN TargetCode ;}
#STD# BEGIN : {yyStart (targetcode); RETURN 'BEGIN' ;}
#STD# CLOSE : {yyStart (targetcode); RETURN 'CLOSE' ;}
#STD# EXPORT : {yyStart (targetcode); RETURN 'EXPORT';}
#STD# GLOBAL : {yyStart (targetcode); RETURN 'GLOBAL';}
#STD# IMPORT : {yyStart (targetcode); RETURN 'IMPORT';}
#STD# LOCAL : {yyStart (targetcode); RETURN 'LOCAL' ;}
#STD#
"!"
| "!="
| "#"
| "%"
| "&"
| "&&"
| "*"
| "+"
| "-"
| "/"
| "<"
| "<<"
| "<="
| "<>"
| "="
| "=="
| ">"
| ">="
| ">>"
| "|"
| "||"
| "~"
| AND
| DIV
| IN
| MOD
| \NOT
| OR
: {GetWord (Word);
Attribute.Operator.Ident := MakeIdent (Word);
RETURN Operator ;}
#STD# "++" | "--" : {GetWord (Word);
Attribute.IncOperator.Ident := MakeIdent (Word);
RETURN IncOperator ;}
#STD# \\ - {\ \t\n} + : {GetWord (Word);
SubString (Word, 2, Length (Word), String);
Attribute.Operator.Ident := MakeIdent (String);
RETURN Operator ;}
INSERT RULES #STD#
#STD# "..." : {RETURN '..' ;}
#STD# ":-" : {RETURN '?' ;}
#STD, expr# letter (letter | digit) *
: {GetWord (Word);
Attribute.Ident.Ident := MakeIdent (Word);
RETURN Ident ;}